package com.link2room.soundwave.util;

import com.link2room.common.constant.AllPmsConstant;
import com.link2room.common.constant.DefaultValue;
import com.link2room.common.redis.RedisUtil;
import com.link2room.common.util.*;
import com.link2room.enums.exception.SoundwaveSysExceptionEnum;
import com.link2room.soundwave.exception.SoundwaveException;
import yuheng.pms.param.YhTokenRequestParamDto;
import yuheng.pms.result.YhTokenDto;
import com.link2room.soundwave.constant.YhPmsConstant;
import org.apache.http.Header;
import org.apache.http.message.BasicHeader;
import org.springframework.util.Assert;

import java.util.Date;
import java.util.Map;
import java.util.Random;

/**
 * Created by sss on 2017/8/23.
 */
public class YhPmsUtil {
    private static RedisUtil redisUtil;

    public static Header[] getYhRequestHeader(String lhotelGroupCode, String reqType) throws Exception {
        String signatureKey;
        if(YhPmsConstant.BASE_REQ.equals(reqType)){
            signatureKey= SysoptionUtil.getSysOption(lhotelGroupCode, YhPmsConstant.CONFIG_CATEGORY,YhPmsConstant.CONFIG_ITEM.BASE_SIGNATUREKEY);
        }else if(YhPmsConstant.MEMBER_REQ.equals(reqType)){
            signatureKey= SysoptionUtil.getSysOption(lhotelGroupCode, YhPmsConstant.CONFIG_CATEGORY,YhPmsConstant.CONFIG_ITEM.MEMBER_SIGNATUREKEY);
        }else {
            throw new SoundwaveException(SoundwaveSysExceptionEnum.YHPMS_REQTYPE_ERROR,"reqType:"+reqType);
        }
        Assert.notNull(signatureKey);
        if(redisUtil==null){
            redisUtil=(RedisUtil) SpringUtil.getBean("redisUtil");
        }
        Object obj = redisUtil.get(getYhTokenRedisKey(lhotelGroupCode,reqType));
        YhTokenDto yhTokenDto;
        Date now=new Date();
        Long timestamp=now.getTime();
        Random rand = new Random();
        int nonce= rand.nextInt(100);
        if(obj!=null){
            yhTokenDto=(YhTokenDto)obj;
            if(timestamp>yhTokenDto.getExpiresDate().getTime()){
                yhTokenDto=getNewToken(lhotelGroupCode,reqType);
            }
        }else {
            yhTokenDto=getNewToken(lhotelGroupCode,reqType);
        }
        String authorization=yhTokenDto.getTokenType()+" "+yhTokenDto.getAccessToken();
        Header[] headers=new Header[5];
        headers[0]=new BasicHeader("Authorization",authorization);
        headers[1]=new BasicHeader("ContentType","application/json");
        headers[2]=new BasicHeader("nonce",String.valueOf(nonce));
        headers[3]=new BasicHeader("signature",YhMd5Util.getSing(timestamp.toString()+nonce+signatureKey+yhTokenDto.getAccessToken()));
        headers[4]=new BasicHeader("timestamp",timestamp.toString());
        return headers;
    }

    private static YhTokenDto getNewToken(String lhotelGroupCode, String reqType) throws Exception {
        String clientId=null;
        String clientSecret=null;
        String clientIp=null;
        if(YhPmsConstant.BASE_REQ.equals(reqType)){
            clientId= SysoptionUtil.getSysOption(lhotelGroupCode, YhPmsConstant.CONFIG_CATEGORY,YhPmsConstant.CONFIG_ITEM.BASE_CLIENTID);
            clientSecret= SysoptionUtil.getSysOption(lhotelGroupCode, YhPmsConstant.CONFIG_CATEGORY,YhPmsConstant.CONFIG_ITEM.BASE_CLIENTSECRET);
            clientIp= SysoptionUtil.getSysOption(lhotelGroupCode, YhPmsConstant.CONFIG_CATEGORY,YhPmsConstant.CONFIG_ITEM.BASE_CLIENTIP);
        }else if(YhPmsConstant.MEMBER_REQ.equals(reqType)){
            clientId= SysoptionUtil.getSysOption(lhotelGroupCode, YhPmsConstant.CONFIG_CATEGORY,YhPmsConstant.CONFIG_ITEM.MEMBER_CLIENTID);
            clientSecret= SysoptionUtil.getSysOption(lhotelGroupCode, YhPmsConstant.CONFIG_CATEGORY,YhPmsConstant.CONFIG_ITEM.MEMBER_CLIENTSECRET);
            clientIp= SysoptionUtil.getSysOption(lhotelGroupCode, YhPmsConstant.CONFIG_CATEGORY,YhPmsConstant.CONFIG_ITEM.MEMBER_CLIENTIP);
        }
        Assert.notNull(clientId);
        Assert.notNull(clientSecret);
        Assert.notNull(clientIp);
        String uri=clientIp+"/api/OAuth2/GetToken";
        YhTokenRequestParamDto yhTokenRequestParamDto=new YhTokenRequestParamDto();
        yhTokenRequestParamDto.setClientId(clientId);
        yhTokenRequestParamDto.setClientSecret(clientSecret);
        String result = HttpUtil.httpGet(uri, yhTokenRequestParamDto);
        Map map = JacksonUtil.jsonToBeanByJavaType(result, Map.class, String.class,Object.class);
        if(false==(boolean)map.get("Success")){
            throw new SoundwaveException(SoundwaveSysExceptionEnum.YHPMS_GETTOKEN_ERROR,(String) map.get("Message"));
        }else{
            Map data=(Map) map.get("Data");
            YhTokenDto yhTokenDto=new YhTokenDto();
            yhTokenDto.setAccessToken((String) data.get("access_token"));
            yhTokenDto.setTokenType((String) data.get("token_type"));
            yhTokenDto.setCustomerid((String) data.get("customerid"));
            yhTokenDto.setExpiresIn(Long.parseLong((String) data.get("expires_in")));
            Date now=new Date();
            if(yhTokenDto.getExpiresIn()!=null){
                yhTokenDto.setExpiresDate(DateUtil.addSeconds(now,yhTokenDto.getExpiresIn()));
            }else {
                yhTokenDto.setExpiresDate(new Date());
            }
            yhTokenDto.setGroupcode((String) data.get("groupcode"));
            yhTokenDto.setHotelcode((String) data.get("hotelcode"));
            yhTokenDto.setSerialno((String) data.get("serialno"));
            yhTokenDto.setUserid((String) data.get("userid"));
            redisUtil.set(getYhTokenRedisKey(lhotelGroupCode,reqType),yhTokenDto);
            return yhTokenDto;
        }
    }

    private static String getYhTokenRedisKey(String lhotelGroupCode,String reqType){
       return AllPmsConstant.PMSTYPE.YHPMS + DefaultValue.CUT+lhotelGroupCode +DefaultValue.CUT+reqType+DefaultValue.CUT+ "Token";
    }
}
